home *** CD-ROM | disk | FTP | other *** search
/ Chip 1997 December / CHIPNET Aralık 1997.iso / linux / redhat / misc / src / install / commands.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-08-11  |  5.0 KB  |  283 lines

  1. #include <errno.h>
  2. #include <fcntl.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <sys/mount.h>
  7. #include <sys/stat.h>
  8. #include <sys/sysmacros.h>
  9. #include <unistd.h>
  10.  
  11. #include "commands.h"
  12. #include "fs.h"
  13. #include "mkswap.h"
  14.  
  15. static int copyfd(int to, int from);
  16.  
  17. static int copyfd(int to, int from) {
  18.     char buf[1024];
  19.     int size;
  20.  
  21.     while ((size = read(from, buf, sizeof(buf))) > 0) {
  22.     if (write(to, buf, size) != size) {
  23.         fprintf(stderr, "error writing output: %s\n", strerror(errno));
  24.         return 1;
  25.     }
  26.     }
  27.  
  28.     if (size < 0) {
  29.     fprintf(stderr, "error reading input: %s\n", strerror(errno));
  30.     return 1;
  31.     }
  32.  
  33.     return 0;
  34. }
  35.  
  36. static int catFile(char * filename) {
  37.     int fd;
  38.     int rc;
  39.  
  40.     fd = open(filename, O_RDONLY);
  41.     if (fd < 0) {
  42.     fprintf(stderr, "cannot open %s: %s\n", filename, strerror(errno));
  43.     return 1;
  44.     }
  45.  
  46.     rc = copyfd(1, fd);
  47.     close(fd);
  48.  
  49.     return rc;
  50. }
  51.  
  52. int catCommand(int argc, char ** argv) {
  53.     char ** argptr = argv + 1;
  54.     int rc;
  55.  
  56.     if (!*argptr) {
  57.     return copyfd(1, 0);
  58.     } else {
  59.     while (*argptr) {
  60.         rc = catFile(*argptr);
  61.         if (rc) return rc;
  62.         argptr++;
  63.     }
  64.     }
  65.  
  66.     return 0;
  67. }
  68.  
  69. int lsmodCommand(int argc, char ** argv) {
  70.     puts("Module:        #pages:  Used by:");
  71.     catFile("/proc/modules");
  72.  
  73.     return 0;
  74. }
  75.  
  76. #define MOUNT_USAGE fprintf(stderr, "usage: mount -t <fs> <device> <dir>\n" \
  77.             "       (if /dev/ is left off the device name, a " \
  78.             "temporary node will be created)\n")
  79.  
  80. int mountCommand(int argc, char ** argv) {
  81.     char * dev, * dir;
  82.     char * fs;
  83.  
  84.     if (argc < 2) {
  85.     return catFile("/proc/mounts");
  86.     } else if (argc == 3) {
  87.     if (strchr(argv[1], ':'))
  88.         fs = "nfs";
  89.     else
  90.         fs = "ext2";
  91.     dev = argv[1];
  92.     dir = argv[2];
  93.     } else if (argc != 5) {
  94.     MOUNT_USAGE;
  95.     return 1;
  96.     } else {
  97.     if (strcmp(argv[1], "-t")) {
  98.         MOUNT_USAGE;
  99.         return 1;
  100.     }
  101.     
  102.     fs = argv[2];
  103.     dev = argv[3];
  104.     dir = argv[4];
  105.  
  106.     }
  107.  
  108.     if (!strncmp(dev, "/dev/", 5) && access(dev, X_OK)) 
  109.     dev += 5;
  110.  
  111.     if (doMount(dev, dir, fs, 0, 1))
  112.     return 1;
  113.  
  114.     return 0;
  115. }
  116.  
  117. int umountCommand(int argc, char ** argv) {
  118.     if (argc != 2) {
  119.     fprintf(stderr, "umount expects a single argument\n");
  120.     return 1;
  121.     }
  122.  
  123.     if (umount(argv[1])) {
  124.     fprintf(stderr, "error unmounting %s: %s\n", argv[1], strerror(errno));
  125.     return 1;
  126.     }
  127.  
  128.     return 0;
  129. }
  130.  
  131. int mkdirCommand(int argc, char ** argv) {
  132.     char ** argptr = argv + 1;
  133.  
  134.     if (argc < 2) {
  135.     fprintf(stderr, "umount expects one or more arguments\n");
  136.     return 1;
  137.     }
  138.  
  139.     while (*argptr) {
  140.     if (mkdir(*argptr, 0755)) {
  141.         fprintf(stderr, "error creating directory %s: %s\n", *argptr,
  142.             strerror(errno));
  143.         return 1;
  144.     }
  145.  
  146.     argptr++;
  147.     }
  148.  
  149.     return 0;
  150. }
  151.  
  152. int mknodCommand(int argc, char ** argv) {
  153.     int major, minor;
  154.     char * path;
  155.     int mode = 0600;
  156.     char *end;
  157.  
  158.     if (argc != 5 && argc != 2) {
  159.     fprintf(stderr, "usage: mknod <path> [b|c] <major> <minor> or mknod <path>\n");
  160.     return 1;
  161.     }
  162.  
  163.     path = argv[1];
  164.  
  165.     if (argc == 2) {
  166.     end = path + strlen(path) - 1;
  167.     while (end > path && *end != '/') end--;
  168.  
  169.     if (devMakeInode(end, path)) {
  170.         return 1;
  171.     }
  172.  
  173.     return 0;
  174.     }
  175.  
  176.     if (!strcmp(argv[2], "b")) 
  177.     mode |= S_IFBLK;
  178.     else if (!strcmp(argv[2], "c"))
  179.     mode |= S_IFCHR;
  180.     else {
  181.     fprintf(stderr, "unknown node type %s\n", argv[2]);
  182.     return 1;
  183.     } 
  184.  
  185.     major = strtol(argv[3], &end, 0);
  186.     if (*end) {
  187.     fprintf(stderr, "bad major number %s\n", argv[3]);
  188.     return 1;
  189.     }
  190.  
  191.     minor = strtol(argv[4], &end, 0);
  192.     if (*end) {
  193.     fprintf(stderr, "bad minor number %s\n", argv[4]);
  194.     return 1;
  195.     }
  196.  
  197.     if (mknod(path, mode, makedev(major, minor))) {
  198.     fprintf(stderr, "mknod failed: %s\n", strerror(errno));
  199.     return 1;
  200.     }
  201.  
  202.     return 0;
  203. }
  204.  
  205. int rmCommand(int argc, char ** argv) {
  206.     char ** argptr = argv + 1;
  207.  
  208.     if (argc < 2) {
  209.     fprintf(stderr, "rm expects one or more arguments "
  210.         "(no flags are supported");
  211.     return 1;
  212.     }
  213.  
  214.     while (*argptr) {
  215.     if (unlink(*argptr)) {
  216.         fprintf(stderr, "unlink of %s failed: %s\n", *argptr, 
  217.             strerror(errno));
  218.         return 1;
  219.     }
  220.  
  221.     argptr++;
  222.     }
  223.  
  224.     return 0;
  225. }
  226.  
  227. int chmodCommand(int argc, char ** argv) {
  228.     char ** argptr = argv + 2;
  229.     int mode;
  230.     char * end;
  231.  
  232.     if (argc < 3) {
  233.     fprintf(stderr, "usage: chmod <mode> <one or files>\n");
  234.     return 1;
  235.     }
  236.  
  237.     mode = strtol(argv[1], &end, 8);
  238.     if (*end) {
  239.     fprintf(stderr, "illegal mode %s\n", argv[1]);
  240.     return 1;
  241.     }
  242.  
  243.     while (*argptr) {
  244.     if (chmod(*argptr, mode)) {
  245.         fprintf(stderr, "error in chmod of %s to 0%o: %s\n", *argptr,
  246.             mode, strerror(errno));
  247.         return 1;
  248.     }
  249.  
  250.     argptr++;
  251.     }
  252.  
  253.     return 0;
  254. }
  255.  
  256. int mkswapCommand(int argc, char ** argv) {
  257.     if (argc != 2) {
  258.     fprintf(stderr, "mkswap <device>");
  259.     return 1;
  260.     }
  261.  
  262.     if (!strncmp(argv[0], "/dev/", 5) && access(argv[0], X_OK)) 
  263.     argv[1] += 5;
  264.  
  265.     enableswap(argv[1], 0, 0);
  266.  
  267.     return 0;
  268. }
  269.  
  270. int swaponCommand(int argc, char ** argv) {
  271.     if (argc != 2) {
  272.     fprintf(stderr, "swapon <file>");
  273.     return 1;
  274.     }
  275.  
  276.     if (swapon(argv[1])) {
  277.     perror("swapon:");
  278.     return 1;
  279.     }
  280.  
  281.     return 0;
  282. }
  283.